# 编写初始化日志的匹配文件
import json
import logging
import os
import sys
from logging import handlers

import config
from lib import HTMLTestRunner_PY3


def init_logging():
    # 实例化日志器
    logger = logging.getLogger()
    # 设置日志等级
    logger.setLevel(logging.INFO)
    # 获取日志处理器
    # 控制台处理器
    sh = logging.StreamHandler()
    # 文件处理器 os.path.dirname(os.path.abspath(__file__)) 是获取当前utils.py的父级目录
    fh = logging.handlers.TimedRotatingFileHandler(os.path.dirname(os.path.abspath(__file__)) + "/logs/edu.log",
                                                   when='h',
                                                   interval=24,
                                                   backupCount=3,
                                                   encoding="utf-8")
    # 设置日志格式
    fmt = "%(asctime)s [%(levelname)s] [%(funcName)s %(lineno)d] %(message)s"
    formatter = logging.Formatter(fmt)
    # 将格式添加到处理器
    sh.setFormatter(formatter)
    fh.setFormatter(formatter)
    # 将处理器添加到日志器
    logger.addHandler(sh)
    logger.addHandler(fh)
    # 返回日志器
    return logger


def read_json_data(filename):
    # 打开数据文件
    with open(filename, mode='r', encoding="utf-8") as f:
        # 把文件流对象转化成json对象
        jsonData = json.load(f)
        # 定义空列表用来添加数据
        result_list = []
        # 遍历jsonData,提取每一组数据
        for case_data in jsonData:  # type:dict
            # 把case_data的用例数据，转化成元组，然后添加到列表中
            result_list.append(tuple(case_data.values()))

        return result_list


# 获取令牌的函数
def get_token(phone, password):
    # 导入登录的API类
    from api.login_api import LoginApi
    # 实例化登录API类
    login_api = LoginApi()
    # 使用这个登录API类对象login_api发送登录请求，得到响应数据，这个响应数据中有令牌和cookie
    response = login_api.login(phone, password)
    # 打印令牌
    print("登录结果：", response.json())
    # 打印cookie
    print("Cookies=", response.cookies)

    # 设置令牌
    config.BASE_HEADERS['Authorization'] = response.json().get("content").get("access_token")
    # 保存cookie到HEADERS
    print(response.cookies.items())  # 会打印出所有的cookie的键值对，会像字典.items()一样，把数据存放在元组当中
    config.BASE_HEADERS['Cookie'] = f"{response.cookies.items()[0][0]}={response.cookies.items()[0][1]}"

    # 查看保存的结果
    print(config.BASE_HEADERS)


class GernaterResult:

    def __init__(self):
        # 报告名称作为文件流
        report_path = config.BASE_PATH + "/reports/report.html"
        # 使用open打开这个报告，形成文件IO流
        f = open(report_path, 'wb')
        # 使用HTMLTestRunner实例化runner对象
        self.runner = HTMLTestRunner_PY3.HTMLTestRunner(f)
        # 空列表
        self.result_list = list()

    def run_case(self, test_cases):
        # 核心代码，使用实例化的runner对象运行测试用例，得到result的结果（此时还不会有HTML测试报告）
        result = self.runner.run(test_cases)
        # 添加result到列表中（适应多线程）
        self.result_list.append(result)
        return result

    def combine_result(self):
        # 读取第一个result_list中的result数据（读取的原因：需要把result_list的其他结果都整合到第一个
        first_result = self.result_list[0]  # type:HTMLTestRunner_PY3._TestResult
        # 遍历result_list
        for index in range(1, len(self.result_list)):

            for temp in self.result_list[index].result:
                if temp[0] == 0:
                    first_result.addSuccess(temp[1])
                if temp[0] == 1:
                    first_result.addFailure(temp[1], sys.exc_info())
                if temp[0] == 2:
                    first_result.addError(temp[1], sys.exc_info())
        # 返回拼接完成的所有resul数据
        return first_result


class MysqlManager():
    def __init__(self, host=config.MYSQL_HOST,
                 port=config.MYSQL_PORT,
                 user=config.MYSQL_USER,
                 password=config.MYSQL_PASSWORD,
                 charset=config.MYSQL_CHARSET,
                 database=config.MYSQL_DATABASE):
        pass

    # 数据的备份:mysqldump -uroot -proot -hhost edu course > backup.sql
    def back_data(self, table_name):
        mysql_exe_commnad = "mysqldump"  # mysqldump命令所在位置
        back_file_name = config.BASE_PATH + "/backup/backup.sql"  # mysql的备份文件名
        sql = f"{mysql_exe_commnad} -u {config.MYSQL_USER} -p{config.MYSQL_PASSWORD} -P {config.MYSQL_PORT} -h {config.MYSQL_HOST} {config.MYSQL_DATABASE} {table_name} > {back_file_name}"
        logging.info(sql)
        os.system(sql)  # 使用os.system运行备份文件的命令

    # 数据的还原:使用备份的数据还原
    # 命令：mysql -uroot -proot -host edu < 备份的文件
    def recovery(self, filename):
        mysql_exe_commnad = "mysql"  # mysqldump命令所在位置
        sql = f"{mysql_exe_commnad} -u{config.MYSQL_USER} -p{config.MYSQL_PASSWORD} -P {config.MYSQL_PORT} -h {config.MYSQL_HOST} {config.MYSQL_DATABASE} < {filename}"
        logging.info(sql)
        os.system(sql)  # 使用os.system运行备份文件的命令

    # 数据的初始化:mysql -uroot -proot -host edu < 初始化的文件
    def init_data(self, filename):
        mysql_exe_commnad = "mysql"  # mysqldump命令所在位置
        sql = f"{mysql_exe_commnad} -u {config.MYSQL_USER} -p{config.MYSQL_PASSWORD} -P {config.MYSQL_PORT} -h {config.MYSQL_HOST} {config.MYSQL_DATABASE} < {filename}"
        logging.info(sql)
        os.system(sql)  # 使用os.system运行备份文件的命令


if __name__ == '__main__':
    # get_token("15321919666", "123456")

    MysqlManager().back_data("course")
    MysqlManager().recovery(config.BASE_PATH + "/backup/backup.sql")
    MysqlManager().init_data(config.BASE_PATH + "/backup/backup.sql")
